package offer2

/**
https://leetcode.cn/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/

B站 Bobbi520
剑指offer 29.顺时针打印矩阵
输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。

示例：
输入：matrix ={
	[1,2,3],
	[4,5,6],
	[7,8,9]
}

输出：[1,2,3,6,9,8,7,4,5]
*/

func spiralOrder(matrix [][]int) []int {

	if len(matrix) == 0 {
		return nil
	} //如果二维数组长度为0, 直接返回nil即可

	step := 0                            //步数
	size := len(matrix) * len(matrix[0]) //二维数组大小

	top, bottom, right, left := 0, len(matrix)-1, len(matrix[0])-1, 0 //定义四个方向的端点起点           0行
	nums := make([]int, size)                                         //声明结果数组

	for step < size { //步数从0开始, 小于size就继续循环
		for i := left; i <= right && step < size; i++ { //从左到右
			nums[step] = matrix[top][i]
			step++
		}
		top++

		for i := top; i <= bottom && step < size; i++ { //从上到下
			nums[step] = matrix[i][right]
			step++
		}
		right--

		for i := right; i >= left && step < size; i-- { //从右到左
			nums[step] = matrix[bottom][i]
			step++
		}
		bottom--

		for i := bottom; i >= top && step < size; i-- { //从下到上
			nums[step] = matrix[i][left]
			step++
		}
		left++

	}

	return nums //返回结果数组
}
